#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

//1.左移操作符 << 
//移位规则：左边抛弃、右边补0

//int main()
//{
//	int a = 10;
	//00000000000000000000000000001010 - 10
//	int b = a << 1;
	//00000000000000000000000000010100 - 20
//	printf("b = %d", b);
//	return 0;
//}


// 2.右移操作符 >>
//移位规则：⾸先右移运算分两种：
//1. 逻辑右移：左边⽤0填充，右边丢弃
//2. 算术右移：左边⽤原该值的符号位填充，右边丢弃(绝大部分位这个)

//int main()
//{
//	int num = - 2;
	//补码 ：11111111111111111111111111111110 - -2
	//反码 ：01111111111111111111111111111101
	//原码 ：10000000000000000000000000000010
	//int n = num >> 1;
	//补码 ：11111111111111111111111111111111 - -1
//	printf("n = %d\n", n);
//	printf("num = %d\n", num);
//
//	return 0;
//}


// &(按位与） 、 |（按位或） 、 ^（按位异或） 、~（按位取反）

//int main()
//{
//	int num1 = -3;
//	int num2 = 5;
//	printf("%d\n", num1 & num2); 
//	printf("%d\n", num1 | num2);
//	printf("%d\n", num1 ^ num2);
//	printf("%d\n", ~0);
//	return 0;
//}


//不能创建临时变量（第三个变量），实现两个整数的交换。
//int main()
//{
//	int a = 10;
//	int b = 20;
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("a = %d b = %d\n", a, b);
//	return 0;
//}
//上述代码可以得出规则：a ^ a = 0; a ^ 0 = a



//求⼀个整数存储在内存中的⼆进制中1的个数
//方法一：
#include<stdio.h>
//int ret(int n)
//{
//	int i = 0;
//	int count = 0;
//	for (i = 0; i < 32; i++) {
//		if (((n >> i) & 1) == 1) {
//			count++;
//		}
//	}
//	return count;
//}

// num 10 : 00000000000000000000000000001010

// 右移后 ：00000000000000000000000000000101
//   &
//      1 ：00000000000000000000000000000001
//          00000000000000000000000000000001 1

//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int retu = ret(num);
//	printf("%d\n", retu);
//
//	return 0;
//}

//编写代码将13二进制序列的第5位修改为1，然后再改回0
//int main()
//{
//	int a = 13;
//	int n = 5;
//	a = a | (1 << (n - 1));
	// a     : 00000000000000000000000000001101
	//   |
	//1 << 4 : 00000000000000000000000000010000
	//       : 00000000000000000000000000011101 - 29
	//printf("%d\n", a);
	//a &= ~(1 << (n - 1));
	//1 << 4    : 00000000000000000000000000010000
	//~(1 << 4) : 11111111111111111111111111101111
	//    &
	//a         : 00000000000000000000000000011101
	//          : 00000000000000000000000000001101
//	printf("%d\n", a);
//	return 0;
//}